package cykbt.core;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class ChomskyGrammar {
	private List<Symbol> nonTerminals;
	// private List<Character> terminals;
	private Symbol axiome;

	/**
	 * creer une grammaire de Chomsky
	 * 
	 * @param terminaux
	 * @param nonTerminaux
	 * @param startSymbol
	 */
	public ChomskyGrammar(Collection<Symbol> nonTerminals, Symbol startSymbol) {
		this.nonTerminals = new ArrayList<Symbol>(nonTerminals);
		// this.terminals = terminals;
		this.axiome = startSymbol;
	}

	/**
	 * 
	 * @param c
	 * @return la liste des symboles pouvant dériver vers ce charactere
	 */
	public List<Symbol> getSymbolsThatCanDeriveTo(char c) {
		List<Symbol> symboles = new ArrayList<Symbol>();
		for (Symbol symbol : nonTerminals)
			if (symbol.derivesTo(c))
				symboles.add(symbol);
		return symboles;
	}

	/**
	 * 
	 * @param cellule1
	 * @param cellule2
	 * @return la liste des symboles pouvant dériver vers la concaténation de
	 *         l'ensemble des paires de symboles des cellules en paramètre
	 *         concaténés entre eux possible
	 */
	public List<Symbol> getSymbolsThatCanDeriveTo(Cell cell1, Cell cell2) {
		List<Symbol> symbols = new ArrayList<Symbol>();
		for (Symbol symbol1 : cell1.getSymbols())
			for (Symbol symbol2 : cell2.getSymbols())
				for (Symbol symbol : nonTerminals)
					if (symbol.derivesTo(symbol1, symbol2)
							&& !symbols.contains(symbol))
						symbols.add(symbol);
		return symbols;
	}

	/**
	 * 
	 * @return le startSymbol de la grammaire
	 */
	public Symbol getAxiome() {
		return this.axiome;
	}

}